package com.lty.jeeg.server.modules.fas.dao;

import java.util.List;
import java.util.Map;

import com.lty.jeeg.server.modules.fas.dto.StockDTO;
import com.lty.jeeg.server.modules.fas.export.StockExportEntity;
import com.lty.jeeg.server.modules.fas.export.StockExportEntityDP;
import org.apache.ibatis.annotations.*;

import org.springframework.stereotype.Repository;

import com.lty.jeeg.server.modules.fas.model.Stock;

/**
 * @author : LTY
 * @date : 2019-02-13 10:11:33
 * Description : 库存统计
 */
@Mapper
@Repository
public interface StockDao {

    /**
     * 根据ID获取
     *
     * @param id ID
     * @return bean
     */
    StockDTO getById(@Param("id") Long id);

    /**
     * 删除
     *
     * @param id ID
     * @return 1/0
     */
    @Update("UPDATE fas_stock t SET t.isDeleted=1 WHERE t.id=#{id}")
    @ResultType(int.class)
    int delete(Long id);

    /**
     * 修改
     *
     * @param stock ID
     * @return 1/0
     */
    int update(Stock stock);

    /**
     * 修改闲置数量
     *
     * @param id
     * @param idleNumber
     * @return
     */
    @Update("UPDATE fas_stock t SET t.idleNumber=#{idleNumber} WHERE t.id=#{id}")
    @ResultType(int.class)
    int updateIdle(@Param("id") Long id, @Param("idleNumber") String idleNumber);

    /**
     * 保存
     *
     * @param stock bean
     * @return ID
     */
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @Insert("insert into fas_stock(goodsId, category, parentCategory, userId, deptId, companyId, totalNumber, idleNumber, remark, createBy, updateBy, isDeleted) values(#{goodsId}, #{category}, #{parentCategory}, #{userId}, #{deptId}, #{companyId}, #{totalNumber}, #{idleNumber}, #{remark}, #{createBy}, #{updateBy}, #{isDeleted})")
    Long save(Stock stock);

    /**
     * 计数
     *
     * @param params 筛选条件
     * @return 总数
     */
    int count(@Param("params") Map<String, Object> params);

    /**
     * 列表
     *
     * @param params 筛选条件
     * @param offset 页码
     * @param limit  分页数目
     * @return beanList
     */
    List<Stock> list(@Param("params") Map<String, Object> params, @Param("offset") Integer offset, @Param("limit") Integer limit);

    /**
     * 列表
     *
     * @param params 筛选条件
     * @param offset 页码
     * @param limit  分页数目
     * @return beanList
     */
    List<Stock> query(@Param("params") Map<String, Object> params, @Param("offset") Integer offset, @Param("limit") Integer limit);

    /**
     * 查询个人库下对应库存信息的id
     *
     * @param stock
     * @return
     */
    Long getIdForPer(Stock stock);

    /**
     * 查询部门库下对应库存信息测id
     *
     * @param stock
     * @return
     */
    Long getIdForDept(Stock stock);

    /**
     * 查询用户库下某个商品库存的id
     *
     * @param goodsId
     * @param userId
     * @param deptId
     * @return
     */
    @Select("select t.id from fas_stock t where t.isDeleted='0' and t.goodsId=#{goodsId} and t.userId=#{userId} and t.deptId=#{deptId} limit 1")
    @ResultType(Long.class)
    Long getIdByUserLib(@Param("goodsId") Long goodsId, @Param("userId") Long userId, @Param("deptId") Long deptId);

    /**
     * 查询部门库下某个商品库存的id
     *
     * @param goodsId
     * @param deptId
     * @return
     */
    @Select("select t.id from fas_stock t where t.isDeleted='0' and t.goodsId=#{goodsId} and t.userId IS NULL and t.deptId=#{deptId} limit 1")
    @ResultType(Long.class)
    Long getIdByDeptLib(@Param("goodsId") Long goodsId, @Param("deptId") Long deptId);

    /**
     * 列表导出
     *
     * @param stockDTO 筛选条件
     * @return beanList
     */
    List<StockExportEntity> getExportDatas(StockDTO stockDTO);

    /**
     * 列表导出(个人列表\部门列表)
     *
     * @param stockDTO 筛选条件
     * @return beanList
     */
    List<StockExportEntityDP> getExportDatasDP(StockDTO stockDTO);

    /**
     * 根据商品id和部门id获取部门库存
     *
     * @param goodsId
     * @param deptidcome
     * @return
     */
    @Select("select t.* from fas_stock t where t.isDeleted=0 and goodsId=#{goodsId} and deptId=#{deptidcome} limit 1")
    @ResultType(Stock.class)
    Stock getByGoodsIdAndDeptId(@Param("goodsId") Long goodsId, @Param("deptidcome") Long deptidcome);

    Stock getCheck(@Param("goodsId") Long goodsId, @Param("deptId") Long deptId, @Param("userId") Long userId);
}
